package com.xyzh.application.base.service;

import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.xyzh.application.common.constants.ReqPage;
import com.xyzh.application.common.util.ResultHelper;

import java.io.Serializable;
import java.util.List;

public interface BasicService <T>{
    /**
     * 保存，融合了根据id和MultiId进行保存
     *
     * @param t
     * @return
     */
    boolean saveEntity(T t) ;

    /**
     * 保存，保存前不进行数据校验
     * @param t
     * @return
     */
    boolean saveEntityNotCheck(T t);

    /**
     * 编辑，融合了根据id和MultiId进行编辑
     *
     * @param t
     * @return
     */
    boolean updateEntity(T t);

    /**
     * 编辑，实体为空的字段不更新
     *
     * @param t
     * @return
     */
    boolean updateEntityNotNull(T t);

    /**
     * 删除，融合了根据id和MultiId进行删除
     *
     * @param t
     * @return
     */
    boolean deleteEntity(T t);

    boolean deleteEntityNotId(T entity);

    /**
     * 批量删除
     * @param list
     * @return
     */
    String deleteBatchEntity(List<T> list);

    /**
     * 根据MultiId进行批量编辑
     *
     * @param list
     * @return
     */
    boolean updateBatchByMultiId(List<T> list);

    /**
     * 根据MultiId进行批量删除
     *
     * @param list
     * @return
     */
    boolean deleteBatchByMultiId(List<T> list);

    /**
     * 根据字段值进行数量统计
     *
     * @param t
     * @return
     */
    long countEntity(T t);

    /**
     * 查询实体个数，使用于@UniqueCheck注解
     *
     * @param t
     * @return
     */
    long queryEntityCount(T t);

    /**
     * 查询对应表中的最大排序码
     *
     * @param table
     * @return
     */
    Integer queryMaxSortkey(String table);

    /**
     * 模糊匹配查询
     *
     * @param t
     * @param isAsc
     * @param orderBy
     * @return
     */
    List<T> listLike(T t, boolean isAsc, String orderBy);

    /**
     * 模糊匹配查询，多字段排序
     *
     * @param t
     * @param isAsc
     * @param orderBy
     * @param orderBys
     * @return
     */
    List<T> listLike(T t, boolean isAsc, String orderBy, String... orderBys);

    /**
     * 精准匹配查询，带排序
     *
     * @param t
     * @param isAsc
     * @param orderBy
     * @return
     */
    List<T> list(T t, boolean isAsc, String orderBy);

    /**
     * 精准匹配查询，多字段排序
     * order by orderBy asc , orderBy1 asc, orderBy2  asc
     *
     * @param t
     * @param isAsc
     * @param orderBy
     * @param orderBys
     * @return
     */
    List<T> list(T t, boolean isAsc, String orderBy, String... orderBys);

    /**
     * 精准匹配查询 默认排序
     *
     * @param t
     * @return
     */
    List<T> list(T t);

    /**
     * 分页查询
     *
     * @param reqPage
     * @return
     */
    ResultHelper queryByPage(ReqPage<T> reqPage);

    /**
     * 模糊分页查询
     *
     * @param reqPage
     * @return
     */
    ResultHelper queryLikeByPage(ReqPage<T> reqPage);

    /**
     * 分页查询
     *
     * @param reqPage
     * @param orderItems
     * @return
     */
    ResultHelper queryByPage(ReqPage<T> reqPage, OrderItem... orderItems);

    /**
     * 模糊分页查询
     *
     * @param reqPage
     * @param orderItems
     * @return
     */
    ResultHelper queryLikeByPage(ReqPage<T> reqPage, OrderItem... orderItems);

    /**
     * 根据MultiId进行查询
     *
     * @param entity
     * @return
     */
    T selectByMultiId(T entity);

    /**
     * 根据id查询
     *
     * @param id
     * @return
     */
    T selectById(Serializable id);





}
